package org.xiaov.bean.result;

import lombok.Getter;

import java.io.Serializable;

/**
 * <p>
 *
 * </p>
 *
 * @author xiaovcloud
 * @since 2021/5/22 21:28
 */
public class R implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 参照Unix命令行返回值 0代表成功，大于0代表不同的错误
     */
    private static final Integer DEFAULT_STATUS_SUCCESS = 0;
    private static final Integer DEFAULT_STATUS_FAIL = 1;

    /**
     * 是否成功的标志
     */
    @Getter
    private final boolean success;
    /**
     * 状态码 成功返回0，否则返回1
     */
    @Getter
    private final Integer code;
    /**
     * 返回的提示信息
     */
    @Getter
    private final String msg;
    /**
     * 返回实体
     */
    @Getter
    private Object data;

    /**
     * 构造方法
     *
     * @param success
     * @param code
     * @param msg
     * @param data
     */
    private R(boolean success, Integer code, String msg, Object data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static R build() {
        return new R(true, null, "", null);
    }

    public static R build(boolean success, Integer code, String msg, Object data) {
        return new R(success, code, msg, data);
    }

    /**
     * 返回成功
     *
     * @return
     */
    public static R ok() {
        return build();
    }

    /**
     * 返回成功
     *
     * @param msg 返回成功信息
     * @return
     */
    public static R okMsg(String msg) {
        return build(true, DEFAULT_STATUS_SUCCESS, msg, null);
    }

    /**
     * 返回成功
     *
     * @param msg  成功信息
     * @param data 成功数据
     * @return
     */
    public static R okMsgAndData(String msg, Object data) {
        return build(true, DEFAULT_STATUS_SUCCESS, msg, data);
    }

    /**
     * 返回失败
     *
     * @return
     */
    public static R fail() {
        return build(false, DEFAULT_STATUS_FAIL, "", null);
    }

    /**
     * 返回失败
     *
     * @param msg 返回失败信息
     * @return
     */
    public static R failMsg(String msg) {
        return build(false, DEFAULT_STATUS_FAIL, msg, null);
    }

    /**
     * 组装数据
     *
     * @param data 设置data
     * @return
     */
    public R setData(Object data) {
        this.data = data;
        return this;
    }
}
